package component

import (
	"github.com/hyperway/pkg/config"
	"net/http"
)

type (
	// NewWebListenerFunc 定义Web服务创建函数，如创建echo框架的Web服务
	NewWebListenerFunc func(config *config.Configuration) WebListener
	// RequestHandlerFunc 定义Web服务处理请求的处理函数，如添加到echo框架里的处理函数
	RequestHandlerFunc func(WebContext) error
	// RequestFilterFunc 定义Web处理函数的过滤器，如echo#Add添加的中间件，先执行过滤器，再执行请求函数
	RequestFilterFunc func(next RequestHandlerFunc) RequestHandlerFunc
	// ErrorHandlerFunc 定义Web服务处理异常错误的处理函数，如echo框架设置panic兜底处理函数，在兜底函数里调用此函数进行自定义的panic处理
	ErrorHandlerFunc func(WebContext, error)
)

type WebListener interface {
	Initializer
	Finalizer
	// Name Web服务名称，同时也是唯一标识，ServerPool通过名称获取Web服务，配合注册接口的属性选择注册的服务器
	Name() string
	// Start 启动Web服务
	Start() error
	// SetErrorHandler 设置Web服务的异常处理函数，如echo框架转发请求后
	SetErrorHandler(errorHandler ErrorHandlerFunc)
	// SetNotFoundHandlerFunc 设置Web服务的404处理函数
	SetNotFoundHandlerFunc(notFoundHandler RequestHandlerFunc)
	// HandleNotFound Web服务的404处理函数，如echo框架转发请求后，在处理函数RequestHandlerFunc中优先检查Api是否下线，如果下线则调用此函数进行异常处理
	HandleNotFound(ctx WebContext) error
	// AddHandler 添加Web服务的处理函数，如echo框架添加路由的处理函数
	AddHandler(method, pattern string, handler RequestHandlerFunc, requestFilter ...RequestFilterFunc)
	// ServeHTTP Web服务的处理函数，如echo框架的ServeHTTP
	ServeHTTP(rw http.ResponseWriter, r *http.Request)
	// XRequestID 获取请求的X-Request-ID，如echo框架的XRequestId
	XRequestID(ctx interface{}) string
	// AddPreRequestFilter 添加Web服务的请求前过滤器，如echo框架的Pre
	AddPreRequestFilter(filter PreRequestFilterFunc)
	//AddPreRequestFilters 添加Web服务的请求前过滤器，如echo框架的Pre
	AddPreRequestFilters(filter ...PreRequestFilterFunc)
}
